package com.shockweb.common.utils;

import java.io.UnsupportedEncodingException;

/**
 * 字符串函数工具
 * @author: 彭明华
 * History:
 * 2017年5月19日   彭明华创建
 */
public class StringUtil {

	/**
	 * 如果source的长度小于len,则在数字前面补key，直到整个字符串长度等于key
	 * @param source 原数据
	 * @param len 长度
	 * @param key 增加的字符
	 * @return String 返回结果数据
	 */
	public static String getFirstFixCode(String source,int len,String key){
		StringBuilder code = new StringBuilder(source);
		while(code.length()<len){
			code.insert(0, key);
		}
		return code.substring(code.length()-len).toString();
	}
	/**
	 * 如果source的长度小于len,则在数字后面补key，直到整个字符串长度等于key
	 * @param source 原数据
	 * @param len 长度
	 * @param key 增加的字符
	 * @return String 返回结果数据
	 */
	public static String getLastFixCode(String source,int len,String key){
		StringBuilder code = new StringBuilder(source);
		while(code.length()<len){
			code.append(key);
		}
		return code.substring(code.length()-len).toString();
	}
	
	/**
	 * 比较两个字符串是否相等
	 * @param value1 
	 * @param value2
	 * @return boolean 相等返回true，否则返回false
	 */
	public static boolean equals(String value1,String value2){
		if(value1==null){
			if(value2==null){
				return true;
			}else{
				return false;
			}
		}else{
			if(value2==null){
				return false;
			}else if(value1.equals(value2)){
				return true;
			}else{
				return false;
			}
		}
	}
	
	/**
	 * 判断是否为中文字符
	 * @param c 字符
	 * @return boolean 如果是返回true，否则返回false
	 */
	private static boolean isChinese(char c) {
		Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
		if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
					|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
					|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
					|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
					|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
					|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
			return true;
		}else{
			return false;
		}
	}

	/**
	 * 返回字符串的实际字节长度，中文算两个字节
	 * @param str 字符串
	 * @return int 长度
	 */
	public static int strlength(String str) {
		int len = 0;
		char[] ch = str.toCharArray();
		for (int i = 0; i < ch.length; i++) {
		   char c = ch[i];
		   len++;
		   if (isChinese(c)) {
			   len++;
		   }
		}
		return len;
	}
	
	/**
	 * 按指定长度后截取子字符串，中文算两个字节
	 * @param str 原字符
	 * @param start 起始位置
	 * @return String
	 */
	public static String substring(String str,int start) {
		if(str==null){
			return null;
		}else{
			StringBuffer sb = new StringBuffer();
			int index = 0;
			for (int i = 0; i <str.length(); i++) {
			   char c = str.charAt(i);
			   if (isChinese(c)) {
				   if(index>=start){
					   sb.append(c);
				   }
				   index = index+2;
			   }else{
				   if(index>=start){
					   sb.append(c);
				   }
				   index++;
			   }
			}
			return sb.toString();
		}
	}
	
	/**
	 * 按指定长度截取子字符串，中文算两个字节
	 * @param str 原字符
	 * @param start 起始位置
	 * @param end 结束位置
	 * @return String 返回截取后的字符
	 */
	public static String substring(String str,int start,int end) {
		if(str==null){
			return null;
		}else{
			StringBuffer sb = new StringBuffer();
			int len = 0;
			int index = 0;
			int realStart = -1;
			for (int i = 0; i <str.length(); i++) {
			   char c = str.charAt(i);
			   if (isChinese(c)) {
				   if(index>=start){
					   if(realStart==-1)
						   realStart = index;
					   if(realStart+len+2 <= end){
						   sb.append(c);
						   len = len+2;
					   }else{
						   break; 
					   }
				   }
				   index = index+2;
			   }else{
				   if(index>=start){
					   if(realStart==-1)
						   realStart = index;
					   if(realStart+len+1 <= end){
						   sb.append(c);
						   len ++;
					   }else{
						   break; 
					   }
				   }
				   index++;
			   }
			}
			return sb.toString();
		}
	}
	

	/**
	 * 中文 转换成  unicode
	 * @param s 原字符串
	 * @return String 转化后的字符
	 */
	 public static String toUnicode(String s){
		 try{
			 if(s==null){
				 return null;
			 }
			 StringBuffer out = new StringBuffer("");   
			 byte[] bytes = s.getBytes("UnicodeBigUnmarked");   
			 for (int i = 0; i < bytes.length - 1; i += 2) {     
				 String str = Integer.toHexString(bytes[i] & 0xff);
				 out.append("u");
				 if(str.length()>0 && !str.equals("0") && !str.equals("00")){
					 out.append(str);
				 }
				 String str1 = Integer.toHexString(bytes[i+1] & 0xff);
				 if(str1.length()==1){
					 out.append("0");
				 }else if(str1.length()==0){
					 out.append("00");
				 }
				 out.append(str1);
			 }
			 return out.toString();
		 }catch(UnsupportedEncodingException e){
			 return s;
		 }
	 }
	 
	/**
	 * unicode转换成  中文 
	 * @param unicodeStr
	 * @return String
	 */
	 public static String decodeUnicode(String unicodeStr){   
		 if(unicodeStr==null){
			 return null;
		 }
		 StringBuffer sb = new StringBuffer();
		 String[] ss = unicodeStr.split("u");
		 for(int i=0;i<ss.length;i++){
			 String value = ss[i];
			 if(value.length()==2){
				 value = "00" + value;
			 }else if(value.length()==1){
				 value = "000" + value;
			 }else if(value.length()==3){
				 value = "00" + value;
			 }
			 if(value.length()>0){
		 		 char c = (char)Integer.parseInt(value,16);   
		 		 sb.append(c);
			 }
		 }
		 return sb.toString(); 
	} 
}
